/**
 * @file         bsc_can_server_if.h
 * @brief        CAN服务框架 ———— 服务接口
 * @note         为插件提供CAN服务
 * @author       Jpz(puzhao.jin@hopechart.com, 靳普诏)
 * @data         2022-8-15
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-8-10   <td>1.0                   <td>Jpz             <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */


#ifndef _BSC_CAN_SERVER_IF_H_
#define _BSC_CAN_SERVER_IF_H_


#include "ofc/ofc_types.h"
#include "bsc_can_server/bsc_can_device.h"

#ifdef __cplusplus
extern "C" {
#endif


    
/**
 * 服务版本接口
 * @param self 操作对象
 * @param version_str：返回服务接口软件版本号描述.
 * @return 具体见错误码的定义
 */
typedef Int32 (*IBsCanServerDoVersion)(PChar *version_str);

/**
 * 插件向宿主任务通知can数据
 * @param self 操作对象
 * @param candata：  需要发往can总线上的数据
 * @param count：    需要发往can总线上的数据个数
 * @return 具体见错误码的定义
 */
typedef Int32 (*IBsCanServerDoSend)(const TBsCanData *candata, Int32 count);

// 为插件提供CAN服务
typedef struct IBsCanServerIfTag IBsCanServerIf;
struct IBsCanServerIfTag
{
    IBsCanServerDoVersion         Version;
    IBsCanServerDoSend            DoSend;       ///< 往can总线发送数据，注册时由服务端填写
};

// ~~~~~~~~~~~~~~~~~ 用户插件调用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/**
 * 获取服务版本号 
 * @param *self     服务插件接口集
 * @param *version_str     版本字符串传出，可以为NULL
 * @return 版本号
 */
Int32 IBsCanServerIfVersion(IBsCanServerIf *self, PChar *version_str);


/**
 * 发送数据帧
 * @param *self     服务插件接口集
 * @param *candata  数据帧地址
 * @param count     数据帧数
 * @return  >= 0    成功发送的个数;
 *          <  0    发送失败
 */
Int32 IBsCanServerIfSend(IBsCanServerIf *self, const TBsCanData *candata, Int32 count);


#ifdef __cplusplus
} // extern "C" {
#endif


#endif // #ifndef _BSC_CAN_PLUG_IF_H_

